/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package compilador.analisadorSintatico.comandos;

import compilador.analisadorLexico.Token;
import compilador.analisadorLexico.TokenClass;
import compilador.analisadorSintatico.Producao;
import compilador.analisadorSintatico.TokenReader;
import compilador.analisadorSintatico.classe.TIPO;
import compilador.analisadorSintatico.metodos.VALOR;
import compilador.analisadorSintatico.simboloGramatical.NaoTerminal;
import compilador.analisadorSintatico.simboloGramatical.SimboloGramatical;
import compilador.analisadorSintatico.simboloGramatical.Terminal;

/**
 *
 * @author João Matos
 */
public class NEW extends Producao {

    @Override
    public SimboloGramatical derivar() throws Exception {
        TokenReader tokenReader =  TokenReader.getInstance();
        Token t = tokenReader.consome();

        if(t.getTokenClass().equals(TokenClass.PALAVRA_RESERVADA) && t.getAtributo().toString().equals("new")){
            ((NaoTerminal) simbolo).add(new Terminal(t));
            
        }else{
            erro("comando new mal formado. 'new' esperado");
            return simbolo;
        }

        Producao p = new TIPO();
        ((NaoTerminal) simbolo).add(p.derivar());

        t = tokenReader.seeCurrent();

        if(t.getTokenClass().equals(TokenClass.OPERADOR) && t.getAtributo().toString().equals("[")){
            ((NaoTerminal) simbolo).add(new Terminal(t));
            t = tokenReader.consome();

            p = new VALOR();

            SimboloGramatical sg = p.derivar();

            //valor é opcional
            if(sg != null)
                ((NaoTerminal) simbolo).add(sg);

            t = tokenReader.consome();
            
            if(t.getTokenClass().equals(TokenClass.OPERADOR) && t.getAtributo().toString().equals("]")){
                ((NaoTerminal) simbolo).add(new Terminal(t));
                
            }else{
                erro(" comando new mal formado. ']' esperado");
            }

        } //não tem um else com erro, pois [ <VALOR> ] é opcional

        return simbolo;
    }

    @Override
    public void setSimbolo() {
        simbolo = new NaoTerminal("NEW");
    }

}
